package com.treepoke.util.string;

import java.math.BigDecimal;

/**
 * Utilitario para justificar a la derecha o izquierda los diferentes tipos de
 * datos: numerico, fecha, decimal y cadena.
 */
public class JustificacionUtil {

    /**
     * Completa a la izquierda una cadena segun el caracter de relleno y la
     * longitud
     *
     * @param cadena
     * @param longitud
     * @param relleno
     * @return String
     */
    public static String completarLongitudCampoIzquierda(String cadena, int longitud, String relleno) {

        StringBuilder cadenaRelleno = new StringBuilder("");
        if (cadena == null) {
            cadena = "";
        }
        if (relleno == null || relleno.equals("")) {
            relleno = " ";
        }

        for (int i = cadena.trim().length(); i < longitud; i++) {
            cadenaRelleno.append(relleno);
        }
        cadena = cadenaRelleno.toString() + cadena.trim();
        cadena = cadena.substring(cadena.length() - longitud, cadena.length());
        return cadena;

    }

    /**
     * Completa a la derecha una cadena segun el caracter de relleno y la
     * longitud
     *
     * @param cadena
     * @param longitud
     * @param relleno
     * @return String
     */
    public static String completarLongitudCampoDerecha(String cadena, int longitud, String relleno) {

        StringBuilder cadenaRelleno = new StringBuilder("");
        if (cadena == null) {
            cadena = "";
        }
        if (relleno == null || relleno.equals("")) {
            relleno = " ";
        }

        for (int i = cadena.trim().length(); i < longitud; i++) {
            cadenaRelleno.append(relleno);
        }
        cadena = cadena.trim() + cadenaRelleno.toString();
        cadena = cadena.substring(0, longitud);
        return cadena;

    }

    /**
     * Completa a la izquierda la parte entera segun el caracter de relleno y la
     * longitud Completa a la derecha la parte decimal segun el caracter de
     * relleno y la longitud Complementa la cadena con el signo y el separador
     *
     * @param decimal
     * @param longitudEntero
     * @param longitudDecimal
     * @param separador
     * @param relleno
     * @param esSignado
     * @return String
     */
    public static String completarLongitudCampoDecimal(BigDecimal decimal, int longitudEntero, int longitudDecimal, String separador, String relleno, Boolean esSignado) {

        String cadena = "";
        String parteEntera = "";
        String parteDecimal = "";
        String signo = "";
        if (separador == null) {
            separador = "";
        }
        if (decimal == null || decimal.compareTo(new BigDecimal(0)) == 0) {
            decimal = new BigDecimal(0);
        }

        cadena = decimal.toString();
        if (cadena.contains(".")) {
            parteEntera = cadena.substring(0, cadena.indexOf("."));
            parteDecimal = cadena.substring(cadena.indexOf(".") + 1, cadena.length());
        } else {
            parteEntera = cadena;
        }
        parteEntera = completarLongitudCampoIzquierda(parteEntera, longitudEntero, relleno);
        parteDecimal = completarLongitudCampoDerecha(parteDecimal, longitudDecimal, relleno);

        if (esSignado) {
            if (decimal.signum() < 0) {
                signo = "-";
            } else {
                signo = "+";
            }
        }
        return signo + parteEntera + separador + parteDecimal;

    }

    public String justificarDerechaEntero(Long entero, Integer tamanoFinalEntero) {
        StringBuilder enteroFinal = new StringBuilder("");
        Double decimales = Math.pow(new Double(10), new Double(tamanoFinalEntero));
        enteroFinal.append((entero.longValue() + decimales.longValue()));
        return enteroFinal.substring(1);

    }

    public String justificarDecimalNoSignado(BigDecimal decimal, Integer tamanoEntero, Integer tamanoDecimal, String caracterSeparador) {

        String cerosderecha = "";
        String cerosizquierda = "";
        for (int i = 1; i <= tamanoEntero; i++) {
            cerosderecha = cerosderecha + "0";
        }
        for (int j = 1; j <= tamanoDecimal; j++) {
            cerosizquierda = cerosizquierda + "0";
        }
        Long decimalEnteroL = decimal.longValue();
        String decimalEnteroS = decimalEnteroL.toString();
        cerosderecha = cerosderecha + decimalEnteroS;
        String decimalParteDecimalS = decimal.toString();
        String decimalParteDecimal = decimalParteDecimalS.substring(decimalParteDecimalS.indexOf(".") + 1, decimalParteDecimalS.length());

        if (decimalParteDecimal.length() > 8) {
            decimalParteDecimal = decimalParteDecimal.substring(0, 8);
        } else if (decimalParteDecimal.length() < 8) {
            int longitudParteDecimal = decimalParteDecimal.length();
            int t = 8 - longitudParteDecimal;
            for (int x = 1; x <= t; x++) {
                decimalParteDecimal = decimalParteDecimal + "0";
            }
        }
        cerosizquierda = cerosizquierda + decimalParteDecimal;

        String parteEntera = cerosderecha.substring(cerosderecha.length() - tamanoEntero, cerosderecha.length());
        String parteDecimal = cerosizquierda.substring(cerosizquierda.length() - tamanoDecimal, cerosizquierda.length());
        String datoJustificado = parteEntera + caracterSeparador + parteDecimal;

        return datoJustificado;
    }
}
